第 7 章:例行性工作排程 crontab
at 僅執行一次的工作排程
啟動 atd
systemctl restart atd # 重新啟動 atd 這個服務
systemctl enable atd # 讓這個服務開機就自動啟動
systemctl status atd # 查閱一下 atd 目前的狀態
atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled) # 是否開機啟動
Active: active (running) since Thu 2015-07-30 19:21:21 CST; 23s ago # 是否正在運作中
Main PID: 26503 (atd)
CGroup: /system.slice/atd.service
└─26503 /usr/sbin/atd -f
Jul 30 19:21:21 study.centos.vbird systemd[1]: Starting Job spooling tools...
Jul 30 19:21:21 study.centos.vbird systemd[1]: Started Job spooling tools.
at 的運作方式
使用 at 產生所要運作的工作,並將這個工作以文字檔的方式寫入 /var/spool/at/ 目錄內,該工作便能等待 atd 這個服務的取用與執行了
並不是所有的人都可以進行 at 工作排程喔!為什麼?因為安全!除非是你認可的帳號,否則先不要讓他們使用 at 吧!那怎麼達到使用 at 的列管呢?
我們可以利用 /etc/at.allow 與 /etc/at.deny 這兩個檔案來進行 at 的使用限制呢!
- 先找尋 /etc/at.allow 這個檔案,寫在這個檔案中的使用者才能使用 at ,沒有在這個檔案中的使用者則 不能使用 at (即使沒有寫在 at.deny 當中);
- 如果 /etc/at.allow 不存在,就尋找 /etc/at.deny 這個檔案,若寫在這個 at.deny 的使用者則不能使用 at ,而沒有在這個 at.deny 檔案中的使用者,就可以使用 at 咯;
- 如果兩個檔案都不存在,那麼只有 root 可以使用 at 這個指令。
透過這個說明,我們知道 /etc/at.allow 是管理較為嚴格的方式,而 /etc/at.deny 則較為鬆散 (因為帳號沒有在該檔案中,就能夠執行 at 了)。在一般的 distributions 當中,由於假設系統上的所有用戶都是可信任的, 因此系統通常會保留一個空的 /etc/at.deny 檔案,意思是允許所有人使用 at 指令的意思 (您可以自行檢查一下該檔案)。 不過,萬一你不希望有某些使用者使用 at 的話,將那個使用者的帳號寫入 /etc/at.deny 即可!
實際運作單一工作排程
at
at [-mldv] TIME
at -c 工作號碼選項與參數:
-m :當 at 的工作完成後,即使沒有輸出訊息,亦以 email 通知使用者該工作已完成。
-l :at -l 相當於 atq,列出目前系統上面的所有該使用者的 at 排程;
-d :at -d 相當於 atrm ,可以取消一個在 at 排程中的工作;
-v :可以使用較明顯的時間格式列出 at 排程中的工作列表;
-c :可以列出後面接的該項工作的實際指令內容。
TIME:時間格式,這裡可以定義出『什麼時候要進行 at 這項工作』的時間,格式有:
HH:MM ex> 04:00
在今日的 HH:MM 時刻進行,若該時刻已超過,則明天的 HH:MM 進行此工作。
HH:MM YYYY-MM-DD ex> 04:00 2015-07-30
強制規定在某年某月的某一天的特殊時刻進行該工作!
HH:MM[am|pm] [Month] [Date] ex> 04pm July 30
也是一樣,強制在某年某月某日的某時刻進行!
HH:MM[am|pm] + number [minutes|hours|days|weeks]
ex> now + 5 minutes ex> 04pm + 3 days
就是說,在某個時間點『再加幾個時間後』才進行。
範例一:再過五分鐘後,將 /root/.bashrc 寄給 root 自己
at now + 5 minutes <==記得單位要加 s 喔!
at>/bin/mail -s "testing at job" root < /root/.bashrc
at> <EOT> <==這裡輸入 [ctrl] + d 就會出現 <EOF> 的字樣!代表結束!
job 2 at Thu Jul 30 19:35:00 2015
# 上面這行資訊在說明,第 2 個 at 工作將在 2015/07/30 的 19:35 進行!
# 而執行 at 會進入所謂的 at shell 環境,讓你下達多重指令等待運作!範例二:將上述的第 2 項工作內容列出來查閱
at -c 2
#!/bin/sh <==就是透過 bash shell 的啦!
# atrun uid=0 gid=0
# mail root 0
umask 22
....(中間省略許多的環境變數項目)....
cd /etc/cron\.d || {
echo 'Execution directory inaccessible' >&2
exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER410efc26'
/bin/mail -s "testing at job" root < /root/.bashrc # 這一行最重要!
marcinDELIMITER410efc26
# 你可以看到指令執行的目錄 (/root),還有多個環境變數與實際的指令內容啦!範例三:由於機房預計於 2015/08/05 停電,我想要在 2015/08/04 23:00 關機?
at 23:00 2015-08-04
at> /bin/sync
at> /bin/sync
at> /sbin/shutdown -h now
at> <EOT>
job 3 at Tue Aug 4 23:00:00 2015
# 您瞧瞧! at 還可以在一個工作內輸入多個指令呢!不錯吧!
at 有另外一個很棒的優點,那就是『背景執行』的功能了!
- 離線繼續工作的任務
- 另一個常用的時刻,由於某個突發狀況導致你必須要進行某項工作時
at 工作的管理
atq
atrm (jobnumber)
# 範例一:查詢目前主機上面有多少的 at 工作排程?
atq
3 Tue Aug 4 23:00:00 2015 a root
# 上面說的是:『在 2015/08/04 的 23:00 有一項工作,該項工作指令下達者為
# root』而且,該項工作的工作號碼 (jobnumber) 為 3 號喔!範例二:將上述的第 3 個工作移除!
atrm 3
atq
# 沒有任何資訊,表示該工作被移除了!
Linux 系統上常見的例行性工作
- 進行登錄檔的輪替 (log rotate)
- 登錄檔分析 logwatch 的任務
- 建立 locate 的資料庫
- man page 查詢資料庫的建立
- RPM 軟體登錄檔的建立
- 移除暫存檔
- 與網路服務有關的分析行為
batch 系統有空時才進行背景任務
batch
範例一:請執行 pi 的計算,然後在系統閒置時,執行 updatdb 的任務
echo "scale=100000; 4*a(1)" | bc -lq &
echo "scale=100000; 4*a(1)" | bc -lq &
echo "scale=100000; 4*a(1)" | bc -lq &
echo "scale=100000; 4*a(1)" | bc -lq &# 然後等待個大約數十秒的時間,之後再來確認一下工作負載的情況!
uptime
19:56:45 up 2 days, 19:54, 2 users, load average: 3.93, 2.23, 0.96
batch
at>/usr/bin/updatedb
at> <EOT>
job 4 at Thu Jul 30 19:57:00 2015
date;atq
Thu Jul 30 19:57:47 CST 2015
4 Thu Jul 30 19:57:00 2015 b root
# 可以看得到,明明時間已經超過了,卻沒有實際執行 at 的任務!
jobs
[1] Running echo "scale=100000; 4*a(1)" | bc -lq &
[2] Running echo "scale=100000; 4*a(1)" | bc -lq &
[3]- Running echo "scale=100000; 4*a(1)" | bc -lq &
[4]+ Running echo "scale=100000; 4*a(1)" | bc -lq &
kill -9 %1 %2 %3 %4# 這時先用 jobs 找出背景工作,再使用 kill 刪除掉四個背景工作後,慢慢等待工作負載的下降
uptime; atq
20:01:33 up 2 days, 19:59, 2 users, load average: 0.89, 2.29, 1.40
4 Thu Jul 30 19:57:00 2015 b root
uptime; atq
20:02:52 up 2 days, 20:01, 2 users, load average: 0.23, 1.75, 1.28
# 在 19:59 時,由於 loading 還是高於 0.8,因此 atq 可以看得到 at job 還是持續再等待當中喔!
# 但是到了 20:01 時, loading 降低到 0.8 以下了,所以 atq 就執行完畢囉!
Cron 循環執行的例行性工作排程
- /etc/cron.allow:將可以使用 crontab 的帳號寫入其中,若不在這個檔案內的使 用者則不可使用 crontab;
- /etc/cron.deny:將不可以使用 crontab 的帳號寫入其中,若未記錄到這個檔案當中的使用者,就可以使用 crontab 。
crontab
crontab [-u username] [-l|-e|-r]選項與參數:
-u :只有 root 才能進行這個任務,亦即幫其他使用者建立/移除 crontab 工作排程;
-e :編輯 crontab 的工作內容
-l :查閱 crontab 的工作內容
-r :移除所有的 crontab 的工作內容,若僅要移除一項,請用 -e 去編輯。範例一:用 dmtsai 的身份在每天的 12:00 發信給自己
crontab -e# 此時會進入 vi 的編輯畫面讓您編輯工作!注意到,每項工作都是一行。0 12 * * * mail -s "at 12:00" dmtsai < /home/dmtsai/.bashrc
#分 時 日 月 週 |<==============指令串========================>|
預設情況下,任何使用者只要不被列入 /etc/cron.deny 當中,那麼他就可以直接下達『 crontab -e 』去編輯自己的例行性命令了!整個過程就如同上面提到的,會進入 vi 的編輯畫面, 然後以一個工作一行來編輯,編輯完畢之後輸入『 :wq 』儲存後離開 vi 就可以了! 而每項工作 (每行) 的格式都是具有六個欄位,這六個欄位的意義為:
代表意義 | 分鐘 | 小時 | 日期 | 月份 | 週 | 指令 |
---|---|---|---|---|---|---|
數字範圍 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 | 呀就指令啊 |
比較有趣的是那個『週』喔!週的數字為 0 或 7 時,都代表『星期天』的意思!另外,還有一些輔助的字符,大概有底下這些:
特殊字符 | 代表意義 |
---|---|
*(星號) | 代表任何時刻都接受的意思!舉例來說,範例一內那個日、月、週都是 * , 就代表著『不論何月、何日的禮拜幾的 12:00 都執行後續指令』的意思! |
,(逗號) | 代表分隔時段的意思。舉例來說,如果要下達的工作是 3:00 與 6:00 時,就會是:0 3,6 * * * command時間參數還是有五欄,不過第二欄是 3,6 ,代表 3 與 6 都適用! |
-(減號) | 代表一段時間範 圍內,舉例來說, 8 點到 12 點之間的每小時的 20 分都進行一項工作:20 8-12 * * * command仔細看到第二欄變成 8-12 喔!代表 8,9,10,11,12 都適用的意思! |
/n(斜線) | 那個 n 代表數字,亦即是『每隔 n 單位間隔』的意思,例如每五分鐘進行一次,則:*/5 * * * * command很簡單吧!用 * 與 /5 來搭配,也可以寫成 0-59/5 ,相同意思! |
我們就來搭配幾個例子練習看看吧!底下的案例請實際用 dmtsai 這個身份作看看喔!後續的動作才能夠搭配起來!
例題:假若你的女朋友生日是 5 月 2 日,你想要在 5 月 1 日的 23:59 發一封信給他,這封信的內容已經寫在 /home/dmtsai/lover.txt 內了,該如何進行?
答:直接下達 crontab -e 之後,編輯成為:59 23 1 5 * mail kiki < /home/dmtsai/lover.txt那樣的話,每年 kiki 都會收到你的這封信喔!(當然囉,信的內容就要每年變一變啦!)
例題:假如每五分鐘需要執行 /home/dmtsai/test.sh 一次,又該如何?
答:同樣使用 crontab -e 進入編輯:*/5 * * * * /home/dmtsai/test.sh
那個 crontab 每個人都只有一個檔案存在,就是在 /var/spool/cron 裡面啊! 還有建議您:『指令下達時,最好使用絕對路徑,這樣比較不會找不到執行檔喔!』
例題:假如你每星期六都與朋友有約,那麼想要每個星期五下午 4:30 告訴你朋友星期六的約會不要忘記,則:
答:還是使用 crontab -e 啊!30 16 * * 5 mail friend@his.server.name < /home/dmtsai/friend.txt
crontab -l
0 12 * * * mail -s "at 12:00" dmtsai < /home/dmtsai/.bashrc
59 23 1 5 * mail kiki < /home/dmtsai/lover.txt
*/5 * * * * /home/dmtsai/test.sh
30 16 * * 5 mail friend@his.server.name < /home/dmtsai/friend.txt
# 注意,若僅想要移除一項工作而已的話,必須要用 crontab -e 去編輯~
# 如果想要全部的工作都移除,才使用 crontab -r 喔!
crontab -r
crontab -l
no crontab for dmtsai
系統的設定檔: /etc/crontab, /etc/cron.d/*
這個『 crontab -e 』是針對使用者的 cron 來設計的,如果是『系統的例行性任務』時, 該怎麼辦呢?是否還是需要以 crontab -e 來管理你的例行性工作排程呢?當然不需要,你只要編輯 /etc/crontab 這個檔案就可以啦!有一點需要特別注意喔!那就是 crontab -e 這個 crontab 其實是 /usr/bin/crontab 這個執行檔,但是 /etc/crontab 可是一個『純文字檔』喔!你可以 root 的身份編輯一下這個檔案哩!
基本上, cron 這個服務的最低偵測限制是『分鐘』,所以『 cron 會每分鐘去讀取一次 /etc/crontab 與 /var/spool/cron 裡面的資料內容 』,因此,只要你編輯完 /etc/crontab 這個檔案。
/etc/crontab
cat /etc/crontab
SHELL=/bin/bash <==使用哪種 shell 介面
PATH=/sbin:/bin:/usr/sbin:/usr/bin <==執行檔搜尋路徑
MAILTO=root <==若有額外STDOUT,以 email將資料送給誰
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
看到這個檔案的內容你大概就瞭解了吧!呵呵,沒錯!這個檔案與將剛剛我們下達 crontab -e 的內容幾乎完全一模一樣!只是有幾個地方不太相同:
- MAILTO=root:
這個項目是說,當 /etc/crontab 這個檔案中的例行性工作的指令發生錯誤時,或者是該工作的執行結果有 STDOUT/STDERR 時,會將錯誤訊息或者是螢幕顯示的訊息傳給誰?預設當然是由系統直接寄發一封 mail 給 root 啦!不過, 由於 root 並無法在用戶端中以 POP3 之類的軟體收信,因此,鳥哥通常都將這個 e-mail 改成自己的帳號,好讓我隨時瞭解系統的狀況!例如: MAILTO=dmtsai@my.host.name
-
PATH=....:
-
『分 時 日 月 周 身份 指令』七個欄位的設定
這個 /etc/crontab 裡面可以設定的基本語法與 crontab -e 不太相同喔!前面同樣是分、時、日、月、周五個欄位, 但是在五個欄位後面接的並不是指令,而是一個新的欄位,那就是『執行後面那串指令的身份』為何!這與使用者的 crontab -e 不相同。由於使用者自己的 crontab 並不需要指定身份,但 /etc/crontab 裡面當然要指定身份啦!以上表的內容來說,系統預設的例行性工作是以 root 的身份來進行的。
crond 服務讀取設定檔的位置
一般來說,crond 預設有三個地方會有執行腳本設定檔,他們分別是:
- /etc/crontab
- /etc/cron.d/*
- /var/spool/cron/*
這三個地方中,跟系統的運作 比較有關係的兩個設定檔是放在 /etc/crontab 檔案內以及 /etc/cron.d/* 目錄內的檔案, 另外一個是跟用戶自己的工作比較有關的設定檔,就是放在 /var/spool/cron/ 裡面的檔案群。 現在我們已經知道了 /var/spool/cron 以及 /etc/crontab 的內容,那現在來瞧瞧 /etc/cron.d 。
/etc/cron.d
ls -l /etc/cron.d
-rw-r--r--. 1 root root 128 Jul 30 2014 0hourly
-rw-r--r--. 1 root root 108 Mar 6 10:12 raid-check
-rw-------. 1 root root 235 Mar 6 13:45 sysstat
-rw-r--r--. 1 root root 187 Jan 28 2014 unbound-anchor
# 其實說真的,除了 /etc/crontab 之外,crond 的設定檔還不少耶!上面就有四個設定!
# 先讓我們來瞧瞧 0hourly 這個設定檔的內容吧!
cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
# 瞧一瞧,內容跟 /etc/crontab 幾乎一模一樣!但實際上是有設定值喔!就是最後一行!
如果你想要自己開發新的軟體,該軟體要擁有自己的 crontab 定時指令時,就可以將『分、時、日、月、周、身份、指令』的設定檔放置到 /etc/cron.d/ 目錄下! 在此目錄下的檔案是『crontab 的設定檔腳本』。
- 個人化的行為使用『 crontab -e 』:如果你是依據個人需求來建立的例行工作排程,建議直接使用 crontab -e 來建立你的工作排程較佳! 這樣也能保障你的指令行為不會被大家看到 (/etc/crontab 是大家都能讀取的權限喔!);
- 系統維護管理使用 『 vim /etc/crontab 』:如果你這個例行工作排程是系統的重要工作,為了讓自己管理方便,同時容易追蹤,建議直接寫入 /etc/crontab 較佳!
- 自己開發軟體使用『 vim /etc/cron.d/newfile 』:如果你是想要自己開發軟體,那當然最好就是使用全新的設定檔,並且放置於 /etc/cron.d/ 目錄內即可。
- 固定每小時、每日、每週、每天執行的特別工作:如果與系統維護有關,還是建議放置到 /etc/crontab 中來集中管理較好。 如果想要偷懶,或者是一定要再某個週期內進行的任務,也可以放置到上面談到的幾個目錄中,直接寫入指令即可!
anacron 處理非 24 小時一直啟動的 Linux 系統的 crontab 的執行
其實 anacron 也是每個小時被 crond 執行一次,然後 anacron 再去檢測相關的排程任務有沒有被執行,如果有超過期限的工作在, 就執行該排程任務,執行完畢或無須執行任何排程時,anacron 就停止了。
由於 anacron 預設會以一天、七天、一個月為期去偵測系統未進行的 crontab 任務,因此對於某些特殊的使用環境非常有幫助。 舉例來說,如果你的 Linux 主機是放在公司給同仁使用的,因為週末假日大家都不在所以也沒有必要開啟, 因此你的 Linux 是週末都會關機兩天的。但是 crontab 大多在每天的凌晨以及週日的早上進行各項任務, 偏偏你又關機了,此時系統很多 crontab 的任務就無法進行。 anacron 剛 好可以解決這個問題!
那麼 anacron 又是怎麼知道我們的系統啥時關機的呢?這就得要使用 anacron 讀取的時間記錄檔 (timestamps) 了! anacron 會去分析現在的時間與時間記錄檔所記載的上次執行 anacron 的時間,兩者比較後若發現有差異, 那就是在某些時刻沒有進行 crontab 囉!此時 anacron 就會開始執行未進行的 crontab 任務了!
anacron 與 /etc/anacrontab
anacron 其實是一支程式並非一個服務!這支程式在 CentOS 當中已經進入 crontab 的排程喔!同時 anacron 會每個小時被主動執行一次喔!
- anacron 的設定檔應該放置在 /etc/cron.hourly
/etc/cron.hourly
cat /etc/cron.hourly/0anacron
#!/bin/sh
# Check whether 0anacron was run today already
if test -r /var/spool/anacron/cron.daily; then
day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
exit 0;
fi
# 上面的語法在檢驗前一次執行 anacron 時的時間戳記!
# Do not run jobs when on battery power
if test -x /usr/bin/on_ac_power; then
/usr/bin/on_ac_power >/dev/null 2>&1
if test $? -eq 1; then
exit 0
fi
fi
/usr/sbin/anacron -s
# 所以其實也僅是執行 anacron -s 的指令!因此我們得來談談這支程式!
anacron
anacron [-sfn] [job]..
anacron -u [job]..選項與參數:
-s :開始一連續的執行各項工作 (job),會依據時間記錄檔的資料判斷是否進行;
-f :強制進行,而不去判斷時間記錄檔的時間戳記;
-n :立刻進行未進行的任務,而不延遲 (delay) 等待時間;
-u :僅更新時間記錄檔的時間戳記,不進行任何工作。
job :由 /etc/anacrontab 定義的各項工作名稱。
在我們的 CentOS 中,anacron 的進行其實是在每個小時都會被抓出來執行一次, 但是為了擔心 anacron 誤判時間參數,因此 /etc/cron.hourly/ 裡面的 anacron 才會在檔名之前加個 0 (0anacron),讓 anacron 最先進行!就是為了讓時間戳記先更新!以避免 anacron 誤判 crontab 尚未進行任何工作的意思。
- anacron 的設定檔: /etc/anacrontab
/etc/anacrontab
cat /etc/anacrontab
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=45 # 隨機給予最大延遲時間,單位是分鐘
START_HOURS_RANGE=3-22 # 延遲多少個小時內應該要執行的任務時間
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
天數 延遲時間 工作名稱定義 實際要進行的指令串
# 天數單位為天;延遲時間單位為分鐘;工作名稱定義可自訂,指令串則通常與 crontab 的設定相同!
more /var/spool/anacron/*
::::::::::::::
/var/spool/anacron/cron.daily
::::::::::::::
20150731
::::::::::::::
/var/spool/anacron/cron.monthly
::::::::::::::
20150703
::::::::::::::
/var/spool/anacron/cron.weekly
::::::::::::::
20150727
# 上面則是三個工作名稱的時間記錄檔以及記錄的時間戳記
我們拿 /etc/cron.daily/ 那一行的設定來說明好了。那四個欄位的意義分別是:
- 天數:anacron 執行當下與時間戳記 (/var/spool/anacron/ 內的時間紀錄檔) 相差的天數,若超過此天數,就準備開始執行,若沒有超過此天數,則不予執行後續的指令。
- 延遲時間:若確定超過天數導致要執行排程工作了,那麼請延遲執行的時間,因為擔心立即啟動會有其他資源衝突的問題吧!
- 工作名稱定義:這個沒啥意義,就只是會 在 /var/log/cron 裡頭記載該項任務的名稱這樣!通常與後續的目錄資源名稱相同即可。
- 實際要進行的指令串:有沒有跟 0hourly 很像啊!沒錯!相同的作法啊!透過 run-parts 來處理的!
根據上面的設定檔內容,我們大概知道 anacron 的執行流程應該是這樣的 (以 cron.daily 為例):
- 由 /etc/anacrontab 分析到 cron.daily 這項工作名稱的天數為 1 天;
- 由 /var/spool/anacron/cron.daily 取出最近一次執行 anacron 的時間戳記;
- 由上個步驟與目前的時間比較,若差異天數為 1 天以上 (含 1 天),就準備進行指令;
- 若準備進行指令,根據 /etc/anacrontab 的設定,將延遲 5 分鐘 + 3 小時 (看 START_HOURS_RANGE 的設定);
- 延遲時間過後,開始執行後續指令,亦即『 run-parts /etc/cron.daily 』這串指令;
- 執行完畢後, anacron 程式結束。
最後,我們來總結一下本章談到的許多設定檔與目錄的關係吧!這樣我們才能了解 crond 與 anacron 的關係:
- crond 會主動去讀取 /etc/crontab, /var/spool/cron/, /etc/cron.d/ 等設定檔,並依據『分、時、日、月、周』的時間設定去各項工作排程;
- 根據 /etc/cron.d/0hourly 的設定,主動去 /etc/cron.hourly/ 目錄下,執行所有在該目錄下的執行檔;
- 因為 /etc/cron.hourly/0anacron 這個指令檔的緣故,主動的每小時執行 anacron ,並呼叫 /etc/anacrontab 的設定檔;
- 根據 /etc/anacrontab 的設定,依據每天、每週、每月去分析 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 內的執行檔,以進行固定週期需要執行的指令。